<?php
namespace app\Home\controller;

//公共控制器
use app\common\controller\Homecontroller;

// 引入验证码信息
use think\captcha\Captcha;

// 导入Cookie
use think\Cookie;

use think\Db;

class Post extends Homecontroller {
    public function __construct() {
        // 手动把父类的方法获取过来
        parent::__construct();
        $this->UserModel = model( 'User.User' );
        $this->PostModel = model( 'Post.Post' );
        $this->CateModel = model( 'Post.Cate' );
        $this->ConfigModel = model( 'Config' );
        $this->RecordModel = model( 'User.record' );
        $this->CommentModel = model( 'Post.Comment' );
    }

    // 添加帖子

    public function add() {

        // 分类列表
        $catelist = $this->CateModel->select();

        // 帖子状态类别
        $statelist = $this->PostModel->state();

        if ( $this->request->isPost() ) {

            // 获取表单数据
            $params = $this->request->param();

            // 获取验证码
            $vercode = $this->request->param( 'vercode', '' );

            // 判断验证码是否正确 如果结果返回true就是正确否则失败
            if ( !captcha_check( $vercode ) ) {
                $this->error( '验证码输入错误！' );
                exit;
            }

            // 获取当前用户的信息
            $LoginUser = Cookie::get( 'LoginUser' );

            // 查询数据库的用户全部信息主要是获取 用户的剩余积分
            $userInfo = $this->UserModel->find( $LoginUser[ 'id' ] );

            // 根据附加功能类型去配置表里面查询相对的积分
            $StatePoint = $this->ConfigModel->where( [ 'key' => "PostState{$params['state']}" ] )->value( 'value' );

            // 判断是否有附加功能配置，若没有 则为0
            $StatePoint = is_numeric( $StatePoint ) ? abs( $StatePoint ) : 0;

            // 发布帖子的总积分 ( 采纳的积分 + 附加功能的积分 ), 使用 bcadd
            $point = bcadd( $params[ 'point' ], $StatePoint );

            // 将用户的积分 - 发布帖子的总积分
            $UpdatePoint = bcsub( $userInfo[ 'point' ], $point );

            // 判断用户剩余的积分 是否满足发布帖子
            if ( $UpdatePoint < 0 ) {
                $this->error( '积分不足，请先充值！' );
                exit;
            }

            // 开启事务
            $this->PostModel->startTrans();
            $this->UserModel->startTrans();
            $this->RecordModel->startTrans();

            // 组装 帖子表 数据
            $PostData = [
                'cateid' => $params[ 'cateid' ],
                'title' => $params[ 'title' ],
                'content' => $params[ 'content' ],
                'point' => $params[ 'point' ],
                'state' => $params[ 'state' ],
                'userid' => $userInfo[ 'id' ],
            ];

            // 插入 帖子表
            $PostRes = $this->PostModel->validate( 'common/Post/Post' )->save( $PostData );

            // 判断插入数据是否成功
            if ( $PostRes === false ) {
                $this->error( $this->PostModel->getError() );
                exit;
            }

            // 组装用户表
            $userData = [
                'id' => $userInfo[ 'id' ],
                'point' => $UpdatePoint,
            ];

            // 更新用户表
            $UserRes = $this->UserModel->isUpdate()->save( $userData );

            // 判断用户表的更新操作是否成功
            if ( $UserRes === false ) {
                // rollback() 事务的回滚
                $this->PostModel->rollback();
                $this->error( $this->UserModel->getError() );
                exit;
            }

            // 积分消费表 组装
            $recordData = [
                'point' => $point,
                'state' => 1,
                'userid' => $userInfo[ 'id' ]
            ];

            // 发布帖子的附加功能类型
            $state = intval( $params[ 'state' ] );

            // 通过附加功能类型给积分消费表的内容封装
            switch( $state ) {
                case 1:
                $recordData[ 'content' ] = '【'.$PostData[ 'title' ].'】采纳积分：<b>'.$params[ 'point' ]."积分</b> 置顶：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                case 2:
                $recordData[ 'content' ] = '【'.$PostData[ 'title' ].'】采纳积分：<b>'.$params[ 'point' ]."积分</b> 精华：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                case 3:
                $recordData[ 'content' ] = '【'.$PostData[ 'title' ].'】采纳积分：<b>'.$params[ 'point' ]."积分</b> 热门：<b>{$StatePoint}积分</b> - 发布时间：".date( 'Y-m-d H:i' );
                break;
                default:
                $recordData[ 'content' ] = '【'.$PostData[ 'title' ].'】采纳积分：<b>'.$params[ 'point' ].'积分</b>  - 发布时间：'.date( 'Y-m-d H:i' );
                break;
            }

            // 插入积分消费表
            $RecorRes = $this->RecordModel->validate( 'common/User/Record' )->save( $recordData );

            // 判断数据库插入是否插入成功
            if ( $RecorRes === false ) {
                $this->PostModel->rollback();
                $this->UserModel->rollback();
                $this->error( $this->RecordModel->getError() );
                exit;
            }

            // 总的判断事务
            if ( $PostRes === false || $RecorRes === false || $UserRes === false ) {
                $this->PostModel->rollback();
                $this->UserModel->rollback();
                $this->RecordModel->rollback();
                $this->error( '发布悬赏帖子失败，请重新操作！' );
            } else {
                $this->PostModel->commit();
                $this->UserModel->commit();
                $this->RecordModel->commit();
                $this->success( '发布悬赏帖子成功，请等待采纳', url( 'home/index/index' ) );
            }

        }

        // 渲染界面
        $this->assign( [
            'catelist' => $catelist,
            'statelist' => $statelist
        ] );

        return $this->fetch();

    }

    // 删除帖子

    public function delete() {
        if ( $this->request->isPost() ) {

            // 信息提示
            $success = [
                'result' => false,
                'msg' => '',
            ];

            $postId = $this->request->param( 'postid' );

            // 获取帖子的全部信息
            $postinfo = $this->PostModel->find( $postId );

            // 判断是否这帖子
            if ( !$postinfo ) {
                $success[ 'msg' ] = '没有帖子！';
                $this->error( '没有帖子！' );
                exit;
            }

            // 获取用户id
            $userId = $this->LoginUser[ 'id' ];

            // 判断删帖子的人是否是正在登陆的人
            if ( $userId != $postinfo[ 'userid' ] ) {
                $success[ 'msg' ] = '没有这个权限删除该帖';
                $this->error( '没有这个权限删除该贴' );
                exit;
            }

            // destroy()两个参数，第一个主键ID，
            $result = $this->PostModel->destroy( $postId );

            if ( $result == false ) {
                $success[ 'msg' ] = '删除失败！';
                $this->error( '删除失败！' );
                exit;
            }

            // 获取所有评论这条帖子的用户id
            $idList = $this->CommentModel->where( [ 'postid' => $postId ] )->select();

            $idArr = [];

            // 循环数据拿到评论的ID
            foreach ( $idList as $item ) {
                array_push( $idArr, $item[ 'id' ] );
            }

            // 把数组转换为字符串
            $commentid = count( $idArr ) > 0 ? implode( ',', $idArr ) : '';

            // 评论做到软删除
            $res = $this->CommentModel->destroy( $commentid );

            if ( $result === false ) {
                // 删除失败
                $success[ 'msg' ] = $this->PostModel->getError();
            } else {
                // 删除成功
                $success[ 'result' ] = true;
                $success[ 'msg' ] = '删除成功！';
            }
            return $success;
        }
    }

    // 编辑帖子

    public function edit() {
        // 帖子的ID
        $postId = $this->request->param( 'postid', 0 );

        // 帖子详情
        $postinfo = $this->PostModel->with( [ 'cate', 'user' ] )->find( $postId );

        if ( !$postinfo ) {
            $this->error( '编辑的帖子不存在' );
            exit;
        }

        // 判断登陆用户的id 和 发帖人的 userid 是否相同
        if ( $postinfo[ 'userid' ] != $this->LoginUser[ 'id' ] ) {
            $this->error( '无权修改此帖' );
            exit;
        }

        // 分类列表
        $catelist = model( 'Post.Cate' )->order( 'id asc' )->limit( 6 )->select();

        $this->assign( [
            'postinfo' => $postinfo,
            'catelist' => $catelist
        ] );

        if ( $this->request->isPost() ) {
            // 获取所有参数
            $params = $this->request->param();

            //获取参数 如果没有就默认为空
            $vercode = $this->request->param( 'vercode', '' );

            //判断验证码是否正确 如果结果返回true就是正确否则失败
            if ( !captcha_check( $vercode ) ) {
                $this->error( '验证码输入错误' );
                exit;
            }

            $data = [
                'id' => $postId,
                'cateid' => $params[ 'cateid' ],
                'title' => $params[ 'title' ],
                'content' => $params[ 'content' ],
                'userid' => $this->LoginUser[ 'id' ],
                'point' => $postinfo[ 'point' ],
                'state' => $postinfo[ 'state' ]
            ];

            $result = $this->PostModel->isUpdate()->save( $data );

            if ( $result === FALSE ) {
                //修改失败
                $this->error( $this->PostModel->getError() );
                exit;
            } else {
                //修改成功
                $this->success( '修改成功', url( 'home/index/info', [ 'postid' => $postId ] ) );
                exit;
            }
        }

        return $this->fetch();
    }

}
?>